package com.smart.community.property.service;

import java.util.List;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.smart.community.property.dto.BillingMethodDTO;
import com.smart.community.property.dto.BillingMethodQueryDTO;
import com.smart.community.property.entity.BillingMethod;
import com.smart.community.property.vo.BillingMethodVO;

/**
 * 计费方式服务接口
 * 
 * @author Wu.Liang
 * @since 2025-01-30
 * @version 1.0.0
 */
public interface IBillingMethodService extends IService<BillingMethod> {

    /**
     * 分页查询计费方式
     * 
     * @param query 查询条件
     * @return 分页结果
     * @throws Exception 统一异常
     */
    IPage<BillingMethodVO> getBillingMethodPage(BillingMethodQueryDTO query) throws Exception;

    /**
     * 根据物业公司ID和费用类型查询计费方式列表
     * 
     * @param propertyCompanyId 物业公司ID
     * @param feeType 费用类型
     * @param buildingTypeName 建筑类型名称
     * @return 计费方式列表
     * @throws Exception 统一异常
     */
    List<BillingMethodVO> getBillingMethodsByPropertyCompanyAndFeeType(
        Long propertyCompanyId, String feeType, String buildingTypeName) throws Exception;

    /**
     * 根据物业公司ID列表和费用类型查询计费方式列表
     * 
     * @param propertyCompanyIds 物业公司ID列表
     * @param feeType 费用类型
     * @param buildingTypeName 建筑类型名称
     * @return 计费方式列表
     * @throws Exception 统一异常
     */
    List<BillingMethodVO> getBillingMethodsByPropertyCompanyIdsAndFeeType(
        List<Long> propertyCompanyIds, String feeType, String buildingTypeName) throws Exception;

    /**
     * 根据ID查询计费方式详情
     * 
     * @param id 计费方式ID
     * @return 计费方式详情
     * @throws Exception 统一异常
     */
    BillingMethodVO getBillingMethodDetail(Long id) throws Exception;

    /**
     * 创建计费方式
     * 
     * @param dto 计费方式DTO
     * @return 计费方式ID
     * @throws Exception 统一异常
     */
    Long createBillingMethod(BillingMethodDTO dto) throws Exception;

    /**
     * 更新计费方式
     * 
     * @param dto 计费方式DTO
     * @throws Exception 统一异常
     */
    void updateBillingMethod(BillingMethodDTO dto) throws Exception;

    /**
     * 删除计费方式
     * 
     * @param id 计费方式ID
     * @throws Exception 统一异常
     */
    void deleteBillingMethod(Long id) throws Exception;

    /**
     * 批量删除计费方式
     * 
     * @param ids 计费方式ID列表
     * @throws Exception 统一异常
     */
    void batchDeleteBillingMethods(List<Long> ids) throws Exception;

    /**
     * 根据建筑类型名称查询适用的计费方式
     * 
     * @param propertyCompanyId 物业公司ID
     * @param feeType 费用类型
     * @param buildingTypeName 建筑类型名称
     * @return 计费方式列表
     * @throws Exception 统一异常
     */
    List<BillingMethodVO> getApplicableBillingMethodsByBuildingType(
        Long propertyCompanyId, String feeType, String buildingTypeName) throws Exception;

    /**
     * 检查计费方式是否存在重复
     * 
     * @param propertyCompanyId 物业公司ID
     * @param feeType 费用类型
     * @param buildingTypeName 建筑类型名称
     * @param methodType 计费类型
     * @param excludeId 排除的ID
     * @return 是否存在重复
     * @throws Exception 统一异常
     */
    boolean countDuplicate(Long propertyCompanyId, String feeType, String buildingTypeName, 
                          String methodType, Long excludeId) throws Exception;
}
